// Chain Monitor Service v1.8.0 class ChainMonitor { constructor() { this.watchers = new Map(); this.lastBlock = null; this.isRunning = false; } async startMonitoring() { if (this.isRunning) return; this.isRunning = true; await this._monitorLoop(); } async _monitorLoop() { while (this.isRunning) { try { const block = await this._fetchLatestBlock(); if (this.lastBlock && block.number > this.lastBlock.number) { await this._processNewBlock(block); } this.lastBlock = block; } catch (error) { console.error('Block monitoring error:', error); } await this._delay(3000); } } async _fetchLatestBlock() { const response = await fetch('https://bsc-dataseed.binance.org', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', method: 'eth_getBlockByNumber', params: ['latest', false], id: Date.now() }) }); const data = await response.json(); return data.result; } async _processNewBlock(block) { for (const [address, callback] of this.watchers) { try { const balance = await this._getAddressBalance(address); callback(balance, block.number); } catch (error) { console.error(`Error processing address ${address}:`, error); } } } async _getAddressBalance(address) { const response = await fetch('https://bsc-dataseed.binance.org', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', method: 'eth_getBalance', params: [address, 'latest'], id: Date.now() }) }); const data = await response.json(); return data.result; } _delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } } export const chainMonitor = new ChainMonitor();